820

4 分钟

#Python 程序在 nohup 中没有打印

nohup 用于避免终端挂断时程序退出,在运行耗时很长的任务时非常实用。

nohup command &

使用 nohup 运行程序时,它会将 标准输出标准错误 重定向到 nohup.out 中。 可以使用 tail -f nohup.out 命令来实时查看程序输出的信息。

但是如果你使用 nohup 运行的是 Python 的脚本,你会发现 nohup.out 中很久都没有信息显示。

nohup script.py &

这是因为 Python 程序在交互模式下运行时 标准输出标准错误 采用行缓冲,但在非交互模式下 标准输出 使用块缓冲。

  • 块缓冲:存缓冲区满时进行实际 I/O 并清空缓冲区
  • 行缓存:缓冲区满或遇到换行符时进行实际 I/O 并清空缓冲区

因此,需要等待缓冲区写满,进行实际 I/O 后,才能在 nohup.out 中看到来自 标准输出 的信息。

#解决办法

#关闭缓冲

Python 通过 -u 选项运行脚本时会关闭缓冲功能,但这样会降低性能。

nohup python -u script.py &

#手动设置行缓冲

可以使用 sys.stdout.reconfigure 方法手动将 标准输出 设为行缓冲。

import sys sys.stdout.reconfigure(line_buffering=True)

创建于 2025/6/2

更新于 2025/6/2